// 1.创建koa对象
const Koa = require('koa')
const app = new Koa()
// 2.编写响应函数(中间件)
// ctx:上下文,web容器,ctx.request获得请求对象； ctx.response获得响应对象
// next: 下一个中间件,下一层中间件是否能够得到执行, 取决于next这个函数有没有被调用
// app.use作用：加入中间件
app.use(async (ctx, next) => {
  // 浏览器发起的请求，都会被中间件执行
  console.log('第一层中间件...1', ctx.request.url)
  ctx.response.body = 'hello world'
  const ret = await next()
  console.log('第一层中间件...2', ret)
})
// 内存中间件是否执行取决于外层中间件的next函数是否调用
// 第n层中间件调用next函数之后，执行第n+1层中间件代码；最后一层中间件不必再调用next函数。
// 最后一层中间件（m+1层）执行完之后，调用第m层中间件next函数之后的代码...
// 第二层中间件
app.use(async (ctx, next) => {
  console.log('第二层中间件...1')
  // 调用 next 函数得到的是 Promise 对象, 如果想得到 Promise 所包装的数据, 可以结合 await 和 async获取
  // next()
  const ret = await next() //注意是否使用async/await的区别
  console.log(ret)
  console.log('第二层中间件...2')
  // return ret+"2"
})
// 第三层中间件
app.use((ctx, next) => {
  console.log('第三层中间件')
  return 'i love the dog'
})
// 3.绑定端口号 3000
app.listen(3000)

// 调用 next 函数得到的是 Promise 对象, 如果想得到 Promise 所包装的数据, 可以结合 await 和 async
// next 函数对下层中间件函数进行了Promise的封装，Promise 所包装的数据为下层中间件return返回的数据。
// next函数作用：保证内层中间件可以执行